// encoding utf-8
#ifndef __QpwGeometry__
#define __QpwGeometry__

#include <QtCore/QString>
#include <QtCore/QVector>
#include <QtCore/QUuid>
#include <QtGui/QPolygonF>
#include "QpwDatabase.h"

namespace QpwWorld {

/*! \brief Геометрия объекта, в соответствии с ней, просчитываються столкновения с др объектами

    Обычно подразумеваеться что геометрия задана полигоном, но если неоходимо, то при помощи метода
    setCircle можно установить геометрию типа - круг. При этом будет установлен флаг isCircle,
    который можно проверить при помощи одноименного метода. Сбросить флаг можно при помощи метода
    dropCircleFlag.

    Для полигона, направление обхода - против часовой стрелки (требование физ-движка)

    Если объект имеет составную геометрию (например круг + круг + полигон), то для этого
    предусмотрен список subGeometry,

    Все координаты глобальные!
    Кол-во точек не более 8 (огранечение физ-движка).
    Кол-во подгеометрий не более 256.

    "Подгеометрии" "подгеометрий" не учитываються!

*/
class Geometry : public QPolygonF, public QpwXML::Row {
public:
    explicit Geometry( const QUuid & uuid = QUuid() );
    explicit Geometry( quint32 size, quint32 childCount = 0, const QUuid & uuid = QUuid() );
    virtual ~Geometry() {}

    bool isCircle() const;
    qreal radius() const;
    QByteArray toByteArray() const;
    bool isNull() const { return ( isCircle() && p_radius > 0 ) || subGeometry.count() > 0; }

    void setRadius( qreal radius );
    void dropCircleFlag();
    bool fromByteArray( QByteArray data );

//     inline bool operator == ( const Geometry & geometry ) { return this->uuid == geometry.uuid; }
//     inline bool operator != ( const Geometry & geometry ) { return this->uuid != geometry.uuid; }

    QpwXML::Values values() const;
    void setValues( const QpwXML::Values & values );
    void clear();
    void clearPolygon();

    static QPointF calcCenter( const QPolygonF & polygon ); //!< вычеслить центр окаймляющего прямоугольника

    QVector<Geometry> subGeometry; //<! Для составной геометрии объекта
    QPointF center; //!< центр геометрии(центр объекта)
    QString name;

private:
    void init();

    qreal p_radius;
    bool p_isCircle;

};

};

#endif//__QpwGeometry__
